package org.example.controller;

import jakarta.annotation.Resource;
import org.example.pojo.Voice;
import org.example.service.VoiceService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;
import java.util.Optional;

/**
 * 音频文件管理的控制器类
 * @author rjs
 */

@RestController
@RequestMapping("/voice")
public class VoiceController {

    /**
     * 日志对象,用于记录日志
     */
    private static final Logger logger = LoggerFactory.getLogger(VoiceController.class);


    /**
     * 音频文件服务对象
     */
    @Resource
    private VoiceService voiceService;

    /**
     * 上传音频文件
     *
     * @param file 上传的音频文件
     * @return 保存是否成功
     */
    @PostMapping("/upload")
    public boolean save(@RequestParam("file") MultipartFile file) {
        try {
            // 创建一个Voice对象，用于存储音频文件
            Voice voice = new Voice();
            voice.setVoice(file.getBytes());
            // 调用VoiceService的save方法，将音频文件保存到数据库
            return voiceService.save(voice);
        } catch (IOException e) {
            logger.error("上传音频时出错", e);
            return false;
        }
    }

    /**
     * 根据id查询音频文件
     *
     * @param id 音频文件id
     * @return 音频文件字节数组 with HTTP headers
     */
    @GetMapping("/{id}")
    public ResponseEntity<byte[]> getVoiceById(@PathVariable Long id) {
        // 查询数据库中是否存在该ID的音频文件
        Optional<Voice> voiceOptional = Optional.ofNullable(voiceService.getById(id));
        if (voiceOptional.isPresent()) {
            Voice voice = voiceOptional.get();
            byte[] audio = voice.getVoice(); // 假设getVoice()方法返回byte[]
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.valueOf("audio/mpeg"));
            // 返回音频文件，包含HTTP头
            return new ResponseEntity<>(audio, headers, HttpStatus.OK);
        } else {
            // 如果没有找到音频文件，返回HTTP 404 Not Found
            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
        }
    }

    /**
     * 更新音频文件
     *
     * @param voice 音频文件对象
     * @return 更新是否成功
     */
    @PutMapping
    public boolean updateById(@RequestBody Voice voice) {
        return voiceService.updateById(voice);
    }

    /**
     * 根据id删除音频文件
     *
     * @param id 音频文件id
     * @return 删除是否成功
     */
    @DeleteMapping("/{id}")
    public boolean removeById(@PathVariable Long id) {
        return voiceService.removeById(id);
    }

    /**
     * 查询所有音频文件
     *
     * @return 音频文件列表
     */
    @GetMapping
    public List<Voice> listAll() {
        return voiceService.list();
    }
}


